遷移就像是資料庫的版本控制器,並且讓你可以輕鬆地去定義資料庫的結構,包含新增資料表、修改欄位、創建索引...等等都可以透過程式碼來定義,並且當進行團隊協作時,你可以透過遷移很快的分享你對資料庫的改動或結構給你的夥伴。
遷移是一系列的檔案,放在 database/migrations 目錄下,你可以使用 artisan 提供的指令來新增遷移,新增時你可以選填兩個參數,--create={table_name} 會在新增遷移檔案時預先撰寫好新增「table_name」資料表的程式碼,而 --table={table_name} 則會預先撰寫好已經存在的「table_name」資料表的程式碼:
$ php artisan make:migration create_books_table --create=books
/* 新增資料表 */
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('books', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('books');
}
};
$ php artisan make:migration create_books_table --table=books
/* 已經存在的資料表 */
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::table('books', function (Blueprint $table) {
//
});
}
public function down()
{
Schema::table('books', function (Blueprint $table) {
//
});
}
};
當我們新增一個 Laravel 專案時,會發現在目錄下已經有幾個遷移檔案存在,我們先看看 2014_10_12_000000_create_users_table.php 這個檔案的內容:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('users');
}
};
檔案中有兩個已經定義好的方法 up 和 down,這兩個方法都是告訴應用程式具體要對資料庫做甚麼樣的修改,差別在於 up 是去「執行」修改,down 是「撤銷」修改,上圖中 up 方法裡的 Schema::create() 意思是新增一張名為 users 的資料表,並且透過 $table-> 語法給予資料表欄位與指定資料的型態,至於 down 方法裡的 dropIfExists() 則是檢查資料庫是否有 users 這個資料表,如果存在就把資料表刪除。
※關於如何透過遷移操作欄位(新增欄位、修改欄位、創建索引、添加外鍵...等等),由於語法眾多,詳情請見 Laravel 官方網站
定義好遷移後執行以下 artisan 指令(.env 檔案內關於資料庫的設定務必先設定完畢否則會報錯),Laravel 便會按照檔案名稱的時間先後檢查所有遷移檔案是否被執行,並將那些還沒執行過的全部執行:
$ php artisan migrate
另外指令也支援許多額外選項供操作:
/* 恢復到執行全部遷移之前的初使狀態 */
$ php artisan migrate:reset
/* 恢復到執行全部遷移檔案之前的初使狀態,再執行每一個遷移 */
$ php artisan migrate:refresh
/* 刪除所有資料表(不執行 down 而是直接刪除資料表),再執行每一個遷移 */
$ php artisan migrate:fresh
/* 只恢復到你上一次執行遷移的狀態,可添加參數 --step={n},指定恢復的數量 */
$ php artisan migrate:rollback --step=1
/* 顯示一個列出所有遷移的表格,旁邊會顯示 Yes 或 No 表示是否已經執行過,顯示的數字則代表是第幾次執行指令時執行這個遷移檔案 */
$ php artisan migrate:status